#include <stdint.h>
#include "bsp_uart_v2.h"


/*数据长度定义*/
#define ALTERNATING_LOOP_LEN 5 /* 交流回路数组长度 */
#define DIRECT_LOOP_LEN 6 /* 直流回路数组长度 */
#define DI_LEN 2 /* 直流回路数组长度 */
#define NET_ARR_LEN 4 /* 网络参数数组长度 */
#define DEV_NAME_LEN 16 /* 设备名称长度 */
#define POLE_NUM 16 /* 灯杆编号长度 */
#define LONGITUDE_LEN 8 /* 经度长度 */
#define LATITUDE_LEN 8 /* 纬度长度 */


/*默认阈值定义*/
#define ALTERNATING_HIGH_CURRENT 10  /* 交流回路过流默认阈值 (A)*/
#define DIRECT_HIGH_CURRENT 3.0      /* 直流回路过流默认阈值 (A)*/
#define ALTERNATING_HIGH_VOLTAGE 264 /* 交流回路过压默认阈值 (V) */
#define ALTERNATING_LOW_VOLTAGE 176  /* 交流回路欠压默认阈值 (V) */
#define ALTERNATING_LOW_VOLTAGE_MIN 24  /* 交流回路欠压最低保护默认阈值 (V) */
#define DIRECT_12V_HIGH_VOLTAGE 14   /* 直流12V回路过压默认阈值 (V) */
#define DIRECT_12V_LOW_VOLTAGE 9     /* 直流12V回路欠压默认阈值 (V) */
#define DIRECT_24V_HIGH_VOLTAGE 28   /* 直流24V回路过压默认阈值 (V) */
#define DIRECT_24V_LOW_VOLTAGE 19    /* 直流24V回路过压默认阈值 (V) */
#define HIGH_TEMPERATURE 65          /* 高温告警默认阈值 (℃) */
#define LOW_TEMPERATURE -20          /* 低温告警默认阈值 (℃) */
#define FAN_TEMPERATURE 50           /* 风扇开启默认阈值 (℃) */
#define HEATER_TEMPERATURE -10       /* 加热棒开启默认阈值 (℃) */
#define LEAKAGE_VALUES 10            /* 漏电告警默认阈值 (mA) */
#define MAX_LEAKAGE 300              /* 漏电告警阈值最大值 (mA) */
#define MIN_LEAKAGE 10               /* 漏电告警阈值最小值 (mA) */
#define LEAKAGE_DEFAULT_TIMES 60     /* 漏电告警默认重试时长 */
#define LEAKAGE_DEFAULT_FREQUENCY 3  /* 漏电告警默认重试次数 */
#define TILT_DEFAULT_VALUES 15       /* 默认倾斜阈值 */

/* 默认485端口信息 */
#define BAUDRATE_485_1 9600           /* 485口1默认波特率 */
#define DATABIT_485_1 UART_8_BIT      /* 485口1默认数据位 */
#define STOPBIT_485_1 UART_1_STOP_BIT /* 485口1默认停止位 */
#define PARITY_485_1 NO_PARITY        /* 485口1默认校验位 */
#define FLOWCTL_485_1 NO_FLOW_CTRL    /* 485口1默认流控 */
#define BAUDRATE_485_2 9600           /* 485口2默认波特率 */
#define DATABIT_485_2 UART_8_BIT      /* 485口2默认数据位 */
#define STOPBIT_485_2 UART_1_STOP_BIT /* 485口2默认停止位 */
#define PARITY_485_2 NO_PARITY        /* 485口2默认校验位 */
#define FLOWCTL_485_2 NO_FLOW_CTRL    /* 485口2默认流控 */

#define HEARTBEAT 300 /* 默认心跳周期 （秒） */

#define MAX_HEARTBEAT 300 /* 最大心跳周期 （秒） */
#define MIN_HEARTBEAT 3 /* 最大心跳周期 （秒） */

#define LIGHT_1_AISLE AISLE_220V_4 /* 单灯1通道定义 */
#define LIGHT_2_AISLE AISLE_220V_5 /* 单灯2通道定义 */

#define MAX_LIGHT_VALUES 100 /* 最大调光值 */
#define MIN_LIGHT_VALUES 0 /* 最小调光值 */

#define LIGHT_NO_ACTION 0xFF /* 不进行调光标志 */

#define SWITCH_OPEN 1   /* 开关开启 */
#define SWITCH_CLOSE 0 /* 开关关闭 */

#define TEMPERATURE_CONTROL_LIMIT 5 /* 风扇、加热棒温度控制恢复偏移量 */

#define BOTH_LIGHT_NUM 0xFF /* 双控编号 */
#define MAX_LIGHT_NUM 2 /* 最大单灯编号 */
#define MIN_LIGHT_NUM 1 /* 最小单灯编号 */

#define DEV_CAM 1 /* 摄像头设备编号 */
#define DEV_LCD 2 /* 信息屏设备编号 */
#define DEV_LED 3 /* 单灯设备编号 */
#define DEV_SPK 4 /* 网络音柱设备编号 */
#define DEV_SOS 5 /* 一键求助设备编号 */
#define DEV_ATM 6 /* 微气象仪设备编号 */
#define DEV_WIFI 7 /* WIFI设备编号 */
#define DEV_GAT 8 /* 摄像头设备编号 */
#define DEV_SWI 9 /* 摄像头设备编号 */
#define DEV_FIB 10 /* 摄像头设备编号 */
#define DEV_ONU 11 /* 摄像头设备编号 */
#define DEV_EXT 12 /* 其他设备编号 */
#define DEV_FAN 13 /* 风扇设备编号 */
#define DEV_HEATER 14 /* 加热棒设备编号 */
#define DEV_AIR_SWITCH 15 /* 空开设备编号 */
#define DEV_LIGHTNING_PROTECTOR 16 /* 防雷器设备编号 */

#define AISLE_24V 1
#define AISLE_12V_1 2
#define AISLE_12V_2 3
#define AISLE_12V_3 4
#define AISLE_12V_485_1 5
#define AISLE_12V_485_2 6
#define AISLE_220V_1 7
#define AISLE_220V_2 8
#define AISLE_220V_3 9
#define AISLE_220V_4 10
#define AISLE_220V_5 11
#define AISLE_DI1 12
#define AISLE_DI2 13
#define AISLE_DIRECT_LOOP 14
#define AISLE_ALTERNATING_LOOP 15

#define MAX_TEMPERATURE 70
#define MIN_TEMPERATURE -20

#define MAX_TILT 90
#define MIN_TILT 0

#define LIGHT_PLAN_MAX_NUM 5
#define AMBIENT_PLAN_MAX_NUM 5

#define PLAN_TYPE_NULL 0
#define PLAN_TYPE_LIGHT 1
#define PLAN_TYPE_AMBIENT 2

#define MAX_DAC_VOLTAGE 10

#define SERIAL_485_1 1
#define SERIAL_485_2 2

#define VERSION_LENGTH 20

#define LEAKAGE_NO_ACTION 1
#define LEAKAGE_ACTION 2
#define LEAKAGE_ALARM_REPORT 3

#define LEAKAGE_TIME_TICK 1000

#define AMBIENT_SINGLE_MODE 1 /* 单色流水灯 */
#define AMBIENT_COLOR_MODE 2  /* 彩色流水灯 */
#define AMBIENT_BRIGHT_MODE 3 /* 常亮 */
#define AMBIENT_BLACK_MODE 4  /* 关闭 */

#define MIN_FAN_HEARTER_TEMPERATURE 10

#define OLED_SHOW_PORT 0
#define OLED_SHOW_ALARM 1

#define UPGRADE_VERSION_LEN 20
#define UPGRADE_SHA256_LEN 32

#define UPGRADE_STATUS_NO       0
#define UPGRADE_STATUS_BEGIN    1
#define UPGRADE_STATUS_ON       2
#define UPGRADE_STATUS_REBOOT   3
#define UPGRADE_STATUS_SUCCESS  4
#define UPGRADE_STATUS_FAIL     5

#define GET_TILT_CODE 0x2302
#define CLEAN_OLED_CODE 0x2304
#define SHOW_STRING_OLED_CODE 0x2306
/* OLED */
#define ALARM_OLED_MAX_LEN 4

#define ALARM_ON   1 
#define ALARM_OFF  0

#define LEAKAGE_RETRY_MAX_TIMRE 5
#define LEAKAGE_LONG_MAX_TIMRE 120
#define LEAKAGE_LONG_MIN_TIMRE 30

#define LEAKAGE_VALUES_MAX 300
#define LEAKAGE_VALUES_MIN 0

/**
 * @brief 交流回路开关状态结构体 
 */
typedef struct ALTERNATING_STATUS_s
{
    uint8_t v_BAT_CTRL;
    uint8_t v_Power_DECT1;
    uint8_t v_Power_DECT2;
    uint8_t v_Power_DECT3;
    uint8_t v_Power_DECT4;
    uint8_t v_Power_DECT5;
}ALTERNATING_STATUS_t;


/**
 * @brief 直流回路开关状态结构体 
 */
typedef struct DIRECT_STATUS_s
{
    uint8_t SWITCH_direct_main;
    uint8_t SWITCH_12V_1;
    uint8_t SWITCH_12V_2;
    uint8_t SWITCH_12V_3;
    uint8_t SWITCH_24V;
    uint8_t SWITCH_485_VCC1;
    uint8_t SWITCH_485_VCC2;
}DIRECT_STATUS_t;




/**
 * @brief 升级参数结构体
 */
typedef struct UPGRADE_VALUES_s
{
    uint8_t upgrade_status;
    uint8_t upgrade_source;
    uint16_t subfile_num;
    uint16_t wait_subfile_no;
    uint32_t file_total_num;
    char upgrade_version[UPGRADE_VERSION_LEN];
    char sha256[UPGRADE_SHA256_LEN];
}UPGRADE_VALUES_t;

/**
 * @brief 智慧电源220V支路回路参数结构体
 */
typedef struct BRANCH_220V_LOOP_s
{
    uint8_t loop_1_status;
    uint8_t loop_2_status;
    uint8_t loop_3_status;
    uint8_t loop_4_status;
    uint8_t loop_5_status;
    float loop_1_current;
    float loop_2_current;
    float loop_3_current;
    float loop_4_current;
    float loop_5_current;
    float voltage;
    float light1_power;
    float light2_power;
    float light_voltage;
}BRANCH_220V_LOOP_t;

/**
 * @brief 智慧电源220V通信回路参数结构体
 */
typedef struct COMMUNICAT_LOOP_s
{
    uint8_t loop_status;
    float voltage;
    float current;
    float energy;
    float power_value;
    float power_factor;
    
}COMMUNICAT_LOOP_t;

/**
 * @brief 智慧电源220V单灯回路参数结构体
 */
typedef struct LIGHT_LOOP_s
{
    float voltage;
    float current;
    float energy;
    float power_value;
    float power_factor;
}LIGHT_LOOP_t;


/**
 * @brief 智慧电源北向连接参数结构体 
 */
typedef struct NORTH_CONNECT_s
{
    uint16_t port;
    uint8_t ip[NET_ARR_LEN];
}NORTH_CONNECT_t;

/**
 * @brief 智慧电源描述信息参数结构体 
 */
typedef struct INFO_s
{
    uint16_t heartbeat;               //心跳周期
    uint8_t dev_name[DEV_NAME_LEN];   //设备名称
    uint8_t pole_num[POLE_NUM];       //灯杆编号 
    uint8_t longitude[LONGITUDE_LEN]; //经度
    uint8_t latitude[LATITUDE_LEN];   //纬度
}INFO_t;

/**
 * @brief 智慧电源485参数结构体 
 */
typedef struct SERIAL_485_s
{
    int32_t baudrate;
    uint8_t databit;
    uint8_t stopbit;
    uint8_t parity;
    uint8_t flowctl;
}SERIAL_485_t;

/**
 * @brief 智慧电源网络参数结构体 
 */
typedef struct NET_s
{
    uint8_t ip[NET_ARR_LEN];
    uint8_t mask[NET_ARR_LEN];
    uint8_t gateway[NET_ARR_LEN];
}NET_t;

/**
 * @brief 计划电参数结构体 
 */
typedef struct PLAN_VALUES_s
{
    uint8_t plan_type;
    uint8_t light_values;
    uint8_t light_num;
    uint8_t ambient_type;
    uint32_t work_time;
}PLAN_VALUES_t;

/**
 * @brief 直流回路电参数结构体 
 */
typedef struct DIRECT_ELECTRICITY_s
{
    float V_12V;
    float V_24V;
    float I_12V_1;
    float I_12V_2;
    float I_12V_3;
    float I_24V;
    float I_485_VCC1;
    float I_485_VCC2;
}DIRECT_ELECTRICITY_t;

/**
 * @brief 强电检测参数结构体 
 */
typedef struct STRONG_CURRENT_TASK_s
{
    float alternating_high_current;
    float alternating_high_voltage;
    float alternating_low_voltage;
}STRONG_CURRENT_TASK_t;

/**
 * @brief 弱电检测参数结构体 
 */
typedef struct WEAK_CURRENT_TASK_s
{
    float direct_high_current;
    float direct_12V_high_voltage;
    float direct_12V_low_voltage;
    float direct_24V_high_voltage;
    float direct_24V_low_voltage;
}WEAK_CURRENT_TASK_t;

/**
 * @brief 温度检测参数结构体 
 */
typedef struct TILT_TASK_s
{
    float tilt_x;
    float tilt_y;
    float tilt_z;
    float tilt;
}TILT_TASK_t;

/**
 * @brief 温度检测参数结构体 
 */
typedef struct TEMPERATURE_TASK_s
{
    uint8_t temperature_enable;
    float fan_temperature;
    float heater_temperature;
    float high_temperature;
    float low_temperature;
} TEMPERATURE_TASK_t;

/**
 * @brief 漏电检测参数结构体 
 */
typedef struct LEAKAGE_TASK_s
{
    uint8_t leakage_enable;
    uint8_t leakage_frequency;
    uint16_t leakage_times;
    uint16_t leakage_values;
}LEAKAGE_TASK_t;

/**
 * @brief 漏电监测任务参数获取接口
 * @param leakage_task     
 */
int32_t app_control_leakage_task_get(LEAKAGE_TASK_t * leakage_task);

/**
 * @brief 开关控制
 * @param map       开关状态控制位图 DIRECT_MAIN_EN|ALTERNATING_MAIN_EN
 * @param status    1 开启 0 关闭
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_switch_set(uint8_t port_num, uint8_t status);

/**
 * @brief control模块初始化
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_init(void);

/**
 * @brief 设备温度获取
 * @param temperature 设备温度
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_temperature(float *temperature);

/**
 * @brief 温度监测任务参数获取接口
 * @param temperature_task
 */
int32_t app_control_temperature_task_get(TEMPERATURE_TASK_t *temperature_task);

/**
 * @brief 风扇、加热棒控制
 * @param dev_control     DEV_FAN 风扇  DEV_HEATER 加热棒
 * @param fan_status      SWITCH_CLOSE 关闭 SWITCH_OPEN 开启
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_fan_heater(uint8_t dev_control,uint8_t status);

/**
 * @brief 获取DI通道状态
 * @param DI1       DI1口状态
 * @param DI2       DI2口状态
 * @return int32_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_DI(uint8_t *DI1, uint8_t *DI2);

/**
 * @brief 获取DI设备默认状态
 * @param dev_DI1       DI1口状态
 * @param dev_DI2       DI2口状态
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_DI_dev_status(uint8_t *dev_DI1, uint8_t *dev_DI2);

/**
 * @brief 获取设备类型
 * @param DI_num        DI口编号
 * @param dev_type      设备类型
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_type(uint8_t aisle_num, uint8_t *dev_type);

/**
 * @brief 获取心跳上报周期
 * @param heart       心跳周期(s)
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_heart_get(uint16_t * heart);

/**
 * @brief 设置心跳上报周期
 * @param heart       心跳周期(s)
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_heart_set(uint16_t  heart);

/**
 * @brief 倾斜监控任务获取参数
 * @param tilt_task       倾斜监控任务结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_tilt_task_get(TILT_TASK_t *tilt_task);

/**
 * @brief 获取倾角参数
 * @param angle_x       相对与X轴的倾角
 * @param angle_y       相对与Y轴的倾角
 * @param angle_z       相对与Z轴的倾角
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_tilt(float *angle_x, float *angle_y, float *angle_z);

/**
 * @brief 弱电任务参数获取接口
 * @param weak_current_task
 */
int32_t app_control_weak_current_task_get(WEAK_CURRENT_TASK_t *weak_current_task);

/**
 * @brief 强电任务参数获取接口
 * @param strong_current_task
 */
int32_t app_control_strong_current_task_get(STRONG_CURRENT_TASK_t *strong_current_task);

/**
 * @brief 获取直流回路电参数
 * @param direct_electricity        直流回路电参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_direct_electricity(DIRECT_ELECTRICITY_t *direct_electricity);

/**
 * @brief 配置漏电阈值与重试次数
 * @param leakage_values    漏电阈值
 * @param leakage_times     漏电重试次数
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_leakage_threshold_set(uint16_t leakage_values, uint8_t leakage_times,uint8_t leakage_long);

/**
 * @brief 获取漏电阈值与重试次数
 * @param leakage_values    漏电阈值
 * @param leakage_times     漏电重试次数
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_leakage_threshold_get(uint16_t *leakage_values, uint8_t *leakage_times,uint8_t *leakage_long);

/**
 * @brief 配置高低温阈值
 * @param high_temperature    高温阈值
 * @param low_temperature     低温阈值
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_temperature_threshold_set(float high_temperature, float low_temperature);

/**
 * @brief 获取高低温阈值
 * @param high_temperature    高温阈值
 * @param low_temperature     低温阈值
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_temperature_threshold_get(float *high_temperature, float *low_temperature);

/**
 * @brief 配置风扇、加热棒阈值
 * @param fan_temperature    风扇阈值
 * @param heater_temperature 加热棒阈值
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_fan_heater_threshold_set(float fan_temperature, float heater_temperature);

/**
 * @brief 获取风扇、加热棒阈值
 * @param fan_temperature    风扇阈值
 * @param heater_temperature 加热棒阈值
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_fan_heater_threshold_get(float *fan_temperature, float *heater_temperature);

/**
 * @brief 配置倾斜初值及告警阈值
 * @param tilt_task 倾斜参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_tilt_threshold_set(TILT_TASK_t tilt_task);

/**
 * @brief 配置倾斜初值及告警阈值
 * @param tilt_task 倾斜参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_tilt_threshold_get(TILT_TASK_t *tilt_task);

/**
 * @brief 新增计划
 * @param plan_values 计划参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_plan_add(PLAN_VALUES_t * plan_values);

/**
 * @brief 删除计划
 * @param plan_num 单灯计划编号
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_plan_del(uint8_t plan_num );

/**
 * @brief 查询计划
 * @param plan_num       计划编号
 * @param plan_values    计划参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_plan_sel(uint8_t plan_num ,PLAN_VALUES_t *plan_values);

/**
 * @brief 配置设备映射
 * @param info_num 通道编号
 * @param dev_type 设备类型
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_map_set(uint8_t info_num ,uint8_t dev_type);

/**
 * @brief 获取设备映射
 * @param info_num 通道编号
 * @param dev_type 设备类型
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_map_get(uint8_t info_num ,uint8_t *dev_type);

/**
 * @brief 开关状态获取
 * @param map       开关状态
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_switch_get(uint8_t port_num ,uint8_t *status);

/**
 * @brief 单灯调光控制
 * @param light_values_1    单灯1调光值
 * @param light_values_2    单灯2调光值
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_single_light_set(uint8_t light_values_1,uint8_t light_values_2);

/**
 * @brief 单灯调光值查询
 * @param light_values_1    单灯1调光值
 * @param light_values_2    单灯2调光值
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_single_light_get(uint8_t *light_values_1,uint8_t *light_values_2);

/**
 * @brief 设置设备信息
 * @param dev_info 设备信息结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_info_set(INFO_t dev_info);

/**
 * @brief 获取设备信息
 * @param dev_info 设备信息结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_info_get(INFO_t *dev_info);

/**
 * @brief 设置设备网络信息
 * @param info_num 通道号
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_net_set(NET_t dev_net);

/**
 * @brief 获取设备网络信息
 * @param dev_net 设备网络参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_net_get(NET_t *dev_net);

/**
 * @brief 设置设备平台连接信息
 * @param dev_north_connect 设备平台连接参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_north_connect_set(NORTH_CONNECT_t dev_north_connect);

/**
 * @brief 获取设备平台连接信息
 * @param dev_north_connect 设备平台连接参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_north_connect_get(NORTH_CONNECT_t *dev_north_connect);

/**
 * @brief 设置设备485口信息
 * @param serial_num 串口编号
 * @param serial_485 串口参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_485_set(uint8_t serial_num ,SERIAL_485_t serial_485);

/**
 * @brief 获取设备485口信息
 * @param serial_num 串口编号
 * @param serial_485 串口参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_485_get(uint8_t serial_num ,SERIAL_485_t *serial_485);

/**
 * @brief 设置高低温、漏电告警动作标志
 * @param temperature_flag  高低温动作
 * @param leakage_flag      漏电动作标志
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_temperature_leakage_set(uint8_t temperature_flag,uint8_t leakage_flag);

/**
 * @brief 获取高低温、漏电告警动作标志
 * @param heart       心跳周期(s)
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_temperature_leakage_get(uint8_t *temperature_flag,uint8_t *leakage_flag);

/**
 * @brief 设置di设备初始状态
 * @param DI1_flag      DI1口设备初始状态
 * @param DI2_flag      DI2口设备初始状态
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_DI_flag_set(uint8_t DI1_flag,uint8_t DI2_flag);

/**
 * @brief 查询di设备初始状态
 * @param DI1_flag      DI1口设备初始状态
 * @param DI2_flag      DI2口设备初始状态
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_DI_flag_get(uint8_t *DI1_flag,uint8_t *DI2_flag);

/**
 * @brief 氛围灯控制
 * @param ambient_mode  氛围灯模式
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_ambient_set(uint8_t ambient_mode);

/**
 * @brief 氛围灯模式查询
 * @param ambient_mode  氛围灯模式
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_ambient_get(uint8_t * ambient_mode);

/**
 * @brief 获取主电源电参数
 * @param communicat_loop
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_220v_main_loop_electricity(COMMUNICAT_LOOP_t * communicat_loop);

/**
 * @brief 获取220V支路电参数
 * @param leakage
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_220v_branch_loop_electricity(BRANCH_220V_LOOP_t * branch_220V_loop);

/**
 * @brief 获取直流回路电参数
 * @param direct_electricity        直流回路电参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_direct_electricity(DIRECT_ELECTRICITY_t *direct_electricity);

/**
 * @brief 获取端口电流统计
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_dev_current_get(uint8_t port_num , float * max_current,float * min_current);

/**
 * @brief 重置电量计量
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_energy_reset(void);

/**
 * @brief 获取漏电电流数据
 * @param leakage
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_leakage( uint32_t * leakage_communicate,uint32_t * leakage_light );

/**
 * @brief 更新电量计量
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_energy_update(void);

/**
 * @brief 监控主电源掉电状态
 * @param status
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_220v_main_loop_status(uint8_t * status);

/**
 * @brief 主电源掉电动作
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_main_loop_power_down(void);


/**
 * @brief LED show
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_oled_show_port(uint8_t oled_type);

/**
 * @brief 升级参数配置
 * @param upgrade_values    升级参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_upgrade_values_set( UPGRADE_VALUES_t * upgrade_values);

/**
 * @brief 升级参数获取
 * @param upgrade_values    升级参数结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_upgrade_values_get( UPGRADE_VALUES_t * upgrade_values);

/**
 * @brief 保存数据
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_save(void);

/**
 * @brief 心跳包参数上报
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_heart_package_report(void);

/**
 * @brief 氛围灯控制
 * @param ambient_mode  氛围灯模式
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_ambient_set(uint8_t ambient_mode);

/**
 * @brief 获取交流回路状态
 * @param alternating_status       220V回路状态结构体
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_alternating_status(ALTERNATING_STATUS_t *alternating_status);

/**
 * @brief 通信参数配置
 * @param upgrade_values    升级参数结构体
 */
void app_control_up_type_set( uint8_t up_type);

/**
 * @brief 通信参数获取
 * @param upgrade_values    升级参数结构体
 */
void app_control_up_type_get( uint8_t *up_type);

/**
 * @brief 获取单灯回路电参数
 * @param communicat_loop
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_220v_light_loop_electricity(LIGHT_LOOP_t * light_loop);

/**
 * @brief 设置电量计量
 * @return uint8_t OK：成功  ERROR_COM：失败
 */
int32_t app_control_energy_set(void);
